﻿//-------------------------------------------------------------------
//	Copyright (c) 2010-2014  Zhirnov Andrey
//	This file is part of the "UX Standard Lib" project.
//	See copyright notice in "UX_STL_Ext.h".
//-------------------------------------------------------------------

#include "GLQuery.h"
#include "GLObjectManager.h"

namespace UX_STL
{
namespace GLShell
{
	
//----------------------------- GLQuery ---------------------------//
/*
=================================================
	
=================================================
*/
	GLQuery::GLQuery(): _uID(0), _eTarget(gl_query::_INIT)
	{
	}

	GLQuery::GLQuery(GLQuery &cQ): _uID(cQ._uID), _eTarget(cQ._eTarget)
	{
		cQ._uID = 0;
		cQ.Destroy();
	}

/*
=================================================
	
=================================================
*/
	GLQuery::~GLQuery()
	{
		if ( _uID != 0 )
		{
			GLOM()->DeleteQueries( 1, &_uID );
			_uID = 0;
		}
	}

/*
=================================================
	создание query объекта
=================================================
*/
	bool GLQuery::Create()
	{
		Destroy();
		return GLOM()->GenQueries( 1, &_uID );
	}
	
/*
=================================================
	удаление query объекта
=================================================
*/
	void GLQuery::Destroy()
	{
		if ( _uID != 0 )
		{
			GLOM()->DeleteQueries( 1, &_uID );
			_uID = 0;
		}
		_eTarget = gl_query::_INIT;
	}
	
	

//-------------------------- GLSyncObject -------------------------//
/*
=================================================
	конструктор
=================================================
*/
	GLSyncObject::GLSyncObject(): _pSync(null)
	{
	}

	GLSyncObject::GLSyncObject(GLSyncObject &cSO): _pSync(cSO._pSync)
	{
		cSO._pSync = null;
	}

/*
=================================================
	деструктор
=================================================
*/
	GLSyncObject::~GLSyncObject()
	{
		if ( _pSync != null )
		{
			GLOM()->DeleteSync( _pSync );
			_pSync = null;
		}
	}
	
/*
=================================================
	
=================================================
*/
	bool GLSyncObject::Create()
	{
		Destroy();
		return GLOM()->FenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0, _pSync );
	}

/*
=================================================
	
=================================================
*/
	void GLSyncObject::Destroy()
	{
		if ( _pSync != null )
		{
			GLOM()->DeleteSync( _pSync );
			_pSync = null;
		}
	}

//-------------------------------------------------------------------

}	// GLShell
}	// UX_STL